package cn.youqu.happy.module.youqu.service.userArrange;

import cn.youqu.happy.framework.common.pojo.PageResult;
import cn.youqu.happy.module.youqu.controller.admin.userArrange.vo.UserArrangeCreateReqVO;
import cn.youqu.happy.module.youqu.controller.admin.userArrange.vo.UserArrangeExportReqVO;
import cn.youqu.happy.module.youqu.controller.admin.userArrange.vo.UserArrangePageReqVO;
import cn.youqu.happy.module.youqu.controller.admin.userArrange.vo.UserArrangeUpdateReqVO;
import cn.youqu.happy.module.youqu.controller.app.userArrange.vo.AppUserArrangeUpdateReqVO;
import cn.youqu.happy.module.youqu.dal.dataobject.userArrange.UserArrangeDO;

import javax.validation.Valid;
import java.util.Collection;
import java.util.List;

/**
 * 用户计划 Service 接口
 *
 * @author 王其岩 20112001045
 */
//TODO 定时任务 推送任务提醒
public interface UserArrangeService {

    /**
     * 创建用户计划
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Integer createUserArrange(@Valid UserArrangeCreateReqVO createReqVO);

    /**
     * 更新用户计划
     *
     * @param updateReqVO 更新信息
     */
    void updateUserArrange(@Valid UserArrangeUpdateReqVO updateReqVO);


    /**
     * 更新计划
     *
     * @param updateReqVO
     * @param uid
     */
    void updateUserArrange(@Valid AppUserArrangeUpdateReqVO updateReqVO, Long uid);


    /**
     * 删除用户计划
     *
     * @param id 编号
     */
    void deleteUserArrange(Integer id);

    /**
     * 获得用户计划
     *
     * @param id 编号
     * @return 用户计划
     */
    UserArrangeDO getUserArrange(Integer id);

    /**
     * 获得用户计划
     *
     * @param id 编号
     * @return 用户计划
     */
    UserArrangeDO getUserArrange(Integer id, Long uid);

    UserArrangeDO getUserArrange0(Integer activityId);

    /**
     * 获得用户计划列表
     *
     * @param ids 编号
     * @return 用户计划列表
     */
    List<UserArrangeDO> getUserArrangeList(Collection<Integer> ids);

    List<UserArrangeDO> getUserArrangeList(Collection<Integer> ids, Long uid);

    /**
     * 获得用户计划分页
     *
     * @param pageReqVO 分页查询
     * @return 用户计划分页
     */
    PageResult<UserArrangeDO> getUserArrangePage(UserArrangePageReqVO pageReqVO);


    PageResult<UserArrangeDO> getUserArrangePage(UserArrangePageReqVO pageReqVO, Long uid);

    /**
     * 获得用户计划列表, 用于 Excel 导出
     *
     * @param exportReqVO 查询条件
     * @return 用户计划列表
     */
    List<UserArrangeDO> getUserArrangeList(UserArrangeExportReqVO exportReqVO);

//    boolean cancelUserArrange(Integer id, Long loginUserId);

    /**
     * 校验用户是否拥有此计划 可以是发起者 也可以是同伴
     *
     * @param id
     * @param partner
     * @return
     */
    boolean validateUserOwnUserArrange(Integer id, Long partner);

    //TODO 定时更新计划状态
    void autoUpdateUserArrangeStatus();
}
